'use strict';
const Sentry = require('@sentry/node');

const is_dev = process.env.NODE_ENV !== 'production'

// 公司dev
const sentry_company_dev = 'http://7ee6d0d7ee854439b0a9f71d7c5e9d48@localhost:9000/3'
// 家里dev:
const sentry_home_dev = 'http://3b3438016b6f4cbbb9556255fc95bb67@localhost:9000/6'
// 生产
const sentry_prod = 'https://56b9e304b754490991b82f68bb45b5c3@o429498.ingest.sentry.io/5376239'
Sentry.init({
  dsn: sentry_prod,
  environment: process.env.NODE_ENV,
});

module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      const status = err && err.status || null;
      if (status !== 304) {
        // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
        const error = status === 500 && ctx.app.config.env === 'prod'
          ? '服务器错误'
          : err.message;

        Sentry.withScope(function (scope) {
          scope.addEventProcessor(function (event) {
            return Sentry.Handlers.parseRequest(event, ctx.request);
          });
          Sentry.captureException(err);
        });

        // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
        ctx.app.emit('error', err, ctx);

        // 从 error 对象上读出各个属性，设置到响应中
        ctx.body = {
          code: 2,
          msg: error,
        };
        if (status === 422) {
          ctx.body.detail = err.errors;
        }
      }
      ctx.status = status || 500;
    }
  };
};
